# coding=utf-8
import os
import shutil
import tarfile

from unrar import rarfile
import zipfile
from pathlib import Path
from shutil import copyfile
from job.src.function.record_log import mylog


def unzip_file(file_zip_path, new_zip_dir):
    '''
    解压zip文件，并解决中文文件名乱码的问题
    :param file_zip_path:
    :param new_zip_dir:
    :return: new_unzip_dir： 解压后的路径
    '''
    temp_path = os.path.join(new_zip_dir, 'temp')
    zFile = zipfile.ZipFile(file_zip_path, "r")
    file_lst = zFile.namelist()
    new_unzip_dir = file_lst[0].encode('cp437').decode('gbk')
    if os.path.exists(new_unzip_dir):
        pass
    else:
        for fileM in file_lst:
            extracted_path = Path(zFile.extract(fileM,temp_path))
            # 文件重命名，将中文的文件名还原
            extracted_path.rename(new_zip_dir+'//'+fileM.encode('cp437').decode('gbk'))
        zFile.close()
    return new_unzip_dir

# 解压缩包
def un_rar(orgpath, tarpath=None):
    '''
    压缩包解压，返回加压后的路径
    '''
    mylog.info(f'待解压的文件 {orgpath}')
    cur_path, filename = os.path.split(orgpath)
    f_name, ext = os.path.splitext(filename)
    if tarpath is None:
        target_path = cur_path
    else:
        target_path = tarpath
    mylog.info(f'解压目录 {target_path}')
    after_dir = None
    if ext == '.rar':
        with rarfile.RarFile(orgpath) as rf:
            rf.extractall(target_path)
        after_dir = os.path.join(target_path, f_name)
    elif ext == '.zip':
        un_file = unzip_file(orgpath, target_path)
        after_dir = os.path.join(target_path, un_file)
    elif ext == '.tar':
        with tarfile.open(orgpath, 'r') as tar:
            tar.extractall(target_path)
        after_dir = os.path.join(target_path, f_name)
    else:
        mylog.warn('不支持的压缩包类型！')
    mylog.info(f'解压后的路径 {after_dir}')
    return after_dir


# 废弃方法
def copt_files(basePath, outPath, back_list=[]):
    source_path = os.path.abspath(basePath)
    target_path = os.path.abspath(outPath)
    mylog.info(f'目标路径是 {target_path}')
    if not os.path.exists(target_path):
        os.makedirs(target_path)

    if os.path.exists(source_path):
        # root 所指的是当前正在遍历的这个文件夹的本身的地址
        # dirs 是一个 list，内容是该文件夹中所有的目录的名字(不包括子目录)
        # files 同样是 list, 内容是该文件夹中所有的文件(不包括子目录)
        for root, dirs, files in os.walk(source_path):
            for file in files:
                src_file = os.path.join(root, file)
                if file in back_list:
                    mylog.info(f'Skip file: {src_file}')
                else:
                    shutil.copy(src_file, target_path)
                    mylog.info(f'copy file: {src_file}')
    print('copy files finished!')
    mylog.info(f'{source_path} copy files finished!')
    return True


# 这个程序的作用：
# 可以将A目录下的所有文件以及A目录下的文件夹中的文件复制到另外一个目录B里并且保留所有目录结构
# 这个程序的作用等同于windows下直接将一个文件夹复制到另一个文件夹中（windows的复制也是保留目录结构的）
# 但是不同点是：这个程序复制出的所有文件以及文件夹他们的修改日期、访问日期都是当前系统时间
#               而windows系统的复制之后的文件的修改日期、访问日期都和复制前的时间一样
# 目的：我需要修改一个工程内所有代码文件的创建日期，发现直接在windows下复制实现不了，于是用代码试了试，下面是我
#       实现的python代码（如果文件不多的话，要实现该功能也可以用下面的方法：打开文件，然后随便编辑一个
#       文字->保存->删除刚才编辑的文字->保存。这样做之后修改日期会改为当前时间，创建时间依然不变。）


# 递归函数
def copy_file(path_read, path_write, back_list=[]):
    mylog.info(f'ReadPath: {path_read}')
    mylog.info(f'WritePath: {path_write}')
    # 输出path_read目录下的所有文件包括文件夹的名称
    names = os.listdir(path_read)
    # 循环遍历所有的文件或文件夹
    for name in names:
        # 定义新的读入路径（就是在原来目录下拼接上文件名）
        path_read_new = path_read + "\\" + name
        # 定义新的写入路径（就是在原来目录下拼接上文件名）
        path_write_new = path_write + "\\" + name
        # 判断该读入路径是否是文件夹，如果是文件夹则执行递归，如果是文件则执行复制操作
        if os.path.isdir(path_read_new):
            # 判断写入路径中是否存在该文件夹，如果不存在就创建该文件夹
            if not os.path.exists(path_write_new):
                # 创建要写入的文件夹
                os.mkdir(path_write_new)
            # 执行递归函数，将文件夹中的文件复制到新创建的文件夹中（保留原始目录结构）
            copy_file(path_read_new, path_write_new)
        else:
            # 每复制一次，number+1
            # 将文件path_read_new复制到path_write_new
            file_path, filename = os.path.split(path_read_new)
            if filename in back_list:
                mylog.info(f'Skip file: {path_read_new}')
            else:
                copyfile(path_read_new, path_write_new)
                # mylog.info(f'copy file: {path_read_new}')



if __name__ == "__main__":
    # 定义一个变量，用来记录一共进行了多少次复制（也就是一共有多少个文件）
    number = 0
    # 从该文件夹中复制出来
    path_read = 'C:\FREM_ZIP\\20210322_web\FSK_NCBS'
    # 复制到该文件夹
    path_write = "D:\FREM_ZIP\FSK"
    # 执行递归函数
    copy_file(path_read, path_write)
    # 输出一共有多少个文件
    print(number)
